/**
 * @file sys_manager.h
 * @brief 系统状态管理器
 * @details 管理全局系统状态、板号分配、模式切换
 */

#ifndef __SYS_MANAGER_H__
#define __SYS_MANAGER_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

/* Exported types ------------------------------------------------------------*/

/**
 * @brief 系统工作状态枚举
 */
typedef enum
{
    SYS_STATE_BOOT,      /* 上电初始化，板号分配中 */
    SYS_STATE_PLAYING,   /* MIDI演奏中 */
    SYS_STATE_SETUP      /* 参数设置模式 */
} T_SYSTEM_STATE;

/* Exported constants --------------------------------------------------------*/

#define BOARD_CHAR_MIN          0xB1    /* 最小板号字符 */
#define BOARD_CHAR_MAX          0xBB    /* 最大板号字符(对应板号11) */

/* Exported functions prototypes ---------------------------------------------*/

/**
 * @brief 初始化系统管理器
 * @return 0=成功, -1=失败
 */
int sys_manager_init(void);

/**
 * @brief 获取当前系统状态
 * @return 当前系统状态
 */
T_SYSTEM_STATE sys_manager_get_state(void);

/**
 * @brief 设置系统状态
 * @param state 目标状态
 */
void sys_manager_set_state(T_SYSTEM_STATE state);

/**
 * @brief 获取当前板号
 * @return 板号(1-11)，0表示未分配
 */
uint8_t sys_manager_get_board_id(void);

/**
 * @brief 检查板号是否已分配
 * @return true=已分配, false=未分配
 */
bool sys_manager_is_board_assigned(void);

#include "user_config.h"

#if (FEATURE_DEBUG_BYPASS_BOARD_MANAGER == 0)
/**
 * @brief GPIO中断回调（接收板号并处理）
 * @param board_char 接收到的板号字符(0xB1-0xBB)
 * @note 正常模式下处理板号分配
 */
void sys_manager_gpio_isr_callback(uint8_t board_char);
#endif /* FEATURE_DEBUG_BYPASS_BOARD_MANAGER */

#ifdef __cplusplus
}
#endif

#endif /* __SYS_MANAGER_H__ */

/******************************** 文件结束 *********************************/
